package com.twetec.cms.service.website.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.twetec.cms.common.util.validate.ValidateUtil;
import com.twetec.cms.dao.mapper.website.SiteClusterServerMapper;
import com.twetec.cms.dao.mapper.ucenter.UserMapper;
import com.twetec.cms.model.po.website.SiteClusterServerPO;
import com.twetec.cms.model.po.user.UserPO;
import com.twetec.cms.model.vo.website.SiteClusterServerPageListVO;
import com.twetec.cms.model.vo.website.SiteClusterServerVO;
import com.twetec.cms.model.vo.website.SiteVO;
import com.twetec.cms.service.website.SiteClusterServerService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author zhxl
 * @since 2021-09-23
 */
@Service
public class SiteClusterServerServiceImpl extends ServiceImpl<SiteClusterServerMapper, SiteClusterServerPO> implements SiteClusterServerService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private SiteClusterServerMapper siteClusterServerMapper;



    /**
     * 根据ID查询集群节点
     *
     * @param id
     * @return
     */
    @Override
    public SiteClusterServerVO getSiteClusterById(Long id) {

        // 根据ID查询集群节点
        SiteClusterServerPO siteClusterPO = siteClusterServerMapper.selectById(id);
        if (siteClusterPO == null) return null;

        // PO封装为VO
        SiteClusterServerVO siteClusterVO = new SiteClusterServerVO();
        BeanUtils.copyProperties(siteClusterPO, siteClusterVO);


        // 获取更新人
        UserPO modifierPO = userMapper.selectById(siteClusterPO.getModifierId());
        siteClusterVO.setModifierName(modifierPO.getName());

        return siteClusterVO;
    }

    /**
     * 创建新的集群节点
     * @param siteId
     * @param name
     * @param ip
     * @param ftpPort
     * @param siteRootPath
     * @param status
     * @param remark
     * @param creatorId
     * @return
     */
    @Override
    public Boolean saveSiteClusterServer(Long siteId, String name, String ip, Integer ftpPort, String siteRootPath, Integer status, String remark, Long creatorId) {
        // 新建SiteClusterServerPO对象
        SiteClusterServerPO siteClusterServerPO = new SiteClusterServerPO();

        // 设置属性
        siteClusterServerPO.setSiteId(siteId);
        siteClusterServerPO.setName(name);
        siteClusterServerPO.setIp(ip);
        siteClusterServerPO.setFtpPort(ftpPort);
        siteClusterServerPO.setSiteRootPath(siteRootPath.toLowerCase());

        // 当status不为空的时候就正常赋值，当为空但是创建人Id不为空的话就赋值为0；
        siteClusterServerPO.setStatus(status);

        // 判断备注
        siteClusterServerPO.setRemark(remark);
        // 当创建时创建人ID与更新人Id相同
        if (creatorId != null && StringUtils.isNotEmpty(String.valueOf(creatorId))) {
            siteClusterServerPO.setCreatorId(creatorId);
            siteClusterServerPO.setModifierId(creatorId);
        }

        // 调用方法
        int insert = siteClusterServerMapper.insert(siteClusterServerPO);

        return insert > 0;
    }

    /**
     * 根据Id批量删除
     *
     * @param idList
     * @return
     */
    @Override
    @Transactional
    public Boolean removeByIdList(List<Long> idList, Long modifierId) {

        // 设置更新人
        SiteClusterServerPO siteClusterServerPO = new SiteClusterServerPO();
        siteClusterServerPO.setModifierId(modifierId);
        UpdateWrapper<SiteClusterServerPO> wrapper = new UpdateWrapper<>();
        wrapper.in("ID", idList);

        int update = siteClusterServerMapper.update(siteClusterServerPO, wrapper);
        if (update <= 0) return false;

        // 删除
        int result = siteClusterServerMapper.deleteBatchIds(idList);

        return result > 0;
    }

    /**
     * 根据id更新集群服务器信息
     *
     * @param id
     * @param name
     * @param ip
     * @param ftpPort
     * @param siteRootPath
     * @param status
     * @param remark
     * @param modifierId
     * @return
     */
    @Override
    public Boolean updateSiteClusterServer(Long id, String name, String ip, Integer ftpPort, String siteRootPath, Integer status, String remark, Long modifierId) {
        // 新建SiteClusterServerPO对象
        SiteClusterServerPO siteClusterServerPO = new SiteClusterServerPO();

        // 进行非空判断
        siteClusterServerPO.setId(id);
        // 名字
        siteClusterServerPO.setName(name);
        // ip地址
        siteClusterServerPO.setIp(ip);
        // 端口
        siteClusterServerPO.setFtpPort(ftpPort);
        // 站点根路径
        siteClusterServerPO.setSiteRootPath(siteRootPath);

        // status站点状态
        siteClusterServerPO.setStatus(status);

        // 判断备注
        siteClusterServerPO.setRemark(remark);

        // 更新人id
        if (null != modifierId && StringUtils.isNotEmpty(String.valueOf(modifierId))) {
            siteClusterServerPO.setModifierId(modifierId);
        }

        int result = siteClusterServerMapper.updateById(siteClusterServerPO);

        return result > 0;
    }

    /**
     * 根据id启用、禁用
     *
     * @param id
     * @param modifierId
     * @return
     */
    @Override
    public Boolean updateStatusById(Long id, Integer status, Long modifierId) {

        // 创建一个用于更新的节点对象
        SiteClusterServerPO siteClusterUpdatePO = new SiteClusterServerPO();

        UpdateWrapper<SiteClusterServerPO> updateWrapper = new UpdateWrapper<>();

        // 设置ID
        updateWrapper.eq("ID", id);

        // 设置节点状态
        updateWrapper.set("STATUS", status);

        // 设置更新人id
        updateWrapper.set("MODIFIER_ID", modifierId);

        // 更新并返回
        int result = siteClusterServerMapper.update(siteClusterUpdatePO, updateWrapper);

        return result > 0;
    }

    /**
     * 根据Id删除集群节点
     *
     * @param id
     * @param modifierId
     * @return
     */
    @Override
    @Transactional
    public Boolean removeSiteClusterServerById(Long id, Long modifierId) {
        // 设置更新人
        UpdateWrapper<SiteClusterServerPO> wrapper = new UpdateWrapper<>();
        wrapper.set("MODIFIER_ID", modifierId);
        wrapper.eq("ID", id);
        int update = siteClusterServerMapper.update(new SiteClusterServerPO(), wrapper);
        if (update <= 0) return false;

        // 删除
        int result = siteClusterServerMapper.deleteById(id);
        return result > 0;

    }

    /**
     * 分页查询
     * @param siteId
     * @param name
     * @param ip
     * @param ftpPort
     * @param siteRootPath
     * @param status
     * @param gmtModifiedDateStart
     * @param gmtModifiedDateEnd
     * @param modifierName
     * @param page
     * @param limit
     * @return
     */
    /**
     *     String creatorName,  Date gmtCreateDateStart,Date gmtCreateDateEnd,
      */
    @Override
    public SiteClusterServerPageListVO pageSearchList(Long siteId, String name, String ip, Integer ftpPort, String siteRootPath, Integer status, Date gmtModifiedDateStart, Date gmtModifiedDateEnd, String modifierName, String remark, Integer page, Integer limit) {

        SiteClusterServerPageListVO siteClusterServerPageListVO = new SiteClusterServerPageListVO();

        QueryWrapper<SiteClusterServerPO> wrapper = new QueryWrapper<>();

        // 开始条件判断
        wrapper.eq("SITE_ID", siteId);
        // 服务器名称name
        if (StringUtils.isNotEmpty(name)) wrapper.like("NAME", name);
        // ip地址
        if (StringUtils.isNotEmpty(ip)) wrapper.like("IP", ip);
        // ftpPort
        if (null != ftpPort && ValidateUtil.Number(ftpPort) && ftpPort >= 0) wrapper.eq("FTP_PORT", ftpPort);
        // siteRootPath
        if (StringUtils.isNotEmpty(siteRootPath)) {
            wrapper.like("SITE_ROOT_PATH", siteRootPath.toLowerCase());
        }
        // status
        if (null != status && StringUtils.isNotEmpty(String.valueOf(status))) wrapper.eq("STATUS", status);
        // 更新时间
        if (gmtModifiedDateStart != null) {
            wrapper.ge("GMT_MODIFIED", gmtModifiedDateStart);
        }
        if (gmtModifiedDateEnd != null) {
            wrapper.le("GMT_MODIFIED", gmtModifiedDateEnd);
        }

        // 更新人姓名
        // 根据更新人name查询更新人id
        List<UserPO> userPOList = null;
        if (StringUtils.isNotEmpty(modifierName)) {
            QueryWrapper<UserPO> userWrapper = new QueryWrapper<>();
            // userPOQueryWrapper1.select("ID");
            userWrapper.like("NAME", modifierName);
            userPOList = userMapper.selectList(userWrapper);
        }
        // 更新人ID
        if (userPOList != null && userPOList.size() > 0) {
            ArrayList<Long> userIdList = new ArrayList<>();
            for (UserPO userPO : userPOList) {
                userIdList.add(userPO.getId());
            }
            wrapper.in("MODIFIER_ID", userIdList);
        }
        // 当更新人id查询结果为空，但是传入的更新人姓名不为空的时候，表示表中没有对应的操作人，直接返回空集合
        if ((userPOList == null || userPOList.size() == 0) && StringUtils.isNotEmpty(modifierName)) {
            siteClusterServerPageListVO.setPage(page);
            siteClusterServerPageListVO.setLimit(limit);
            siteClusterServerPageListVO.setTotal(0);
            siteClusterServerPageListVO.setList(new ArrayList<>());
            return siteClusterServerPageListVO;
        }

        // 根据更新时间倒序排列
        wrapper.orderByDesc("GMT_MODIFIED");

        // 备注信息
        if (StringUtils.isNotEmpty(remark)) wrapper.like("REMARK" ,remark);

        // 分页查询
        Page<SiteClusterServerPO> siteClusterServerPOPage = siteClusterServerMapper.selectPage(new Page<SiteClusterServerPO>(page, limit), wrapper);
        // 封装返回值
        siteClusterServerPageListVO.setPage((int) siteClusterServerPOPage.getCurrent());
        siteClusterServerPageListVO.setLimit((int) siteClusterServerPOPage.getSize());
        siteClusterServerPageListVO.setTotal((int) siteClusterServerPOPage.getTotal());

        // 遍历records
        List<SiteClusterServerPO> records = siteClusterServerPOPage.getRecords();
        ArrayList<SiteClusterServerVO> siteClusterServerVOArrayList = new ArrayList<>();

        for (SiteClusterServerPO siteClusterServerPO : records) {
            SiteClusterServerVO siteClusterServerVO = new SiteClusterServerVO();
            BeanUtils.copyProperties(siteClusterServerPO, siteClusterServerVO);

            // 更新人姓名
            QueryWrapper<UserPO> modifierPOQueryWrapper = new QueryWrapper<>();
            modifierPOQueryWrapper.eq("ID", siteClusterServerPO.getModifierId());
            UserPO modifierUserPO = userMapper.selectOne(modifierPOQueryWrapper);
            siteClusterServerVO.setModifierName(modifierUserPO.getName());

            // 添加到集合中
            siteClusterServerVOArrayList.add(siteClusterServerVO);
        }
        siteClusterServerPageListVO.setList(siteClusterServerVOArrayList);

        return siteClusterServerPageListVO;
    }
}
